/**
 * 手写call方法
 */
Function.prototype.myCall = function (ctx, ...args) {
  // 归一化，确保ctx一定是对象
  ctx = ctx === undefined || ctx === null ? globalThis : Object(ctx);

  // 待执行的函数
  const fn = this;
  // 用Symbol作为属性不重复，阻止fn被外部覆盖
  const key = Symbol();
  Object.defineProperty(ctx, key, {
    enumerable: false, // 不可枚举
    value: fn
  });

  // 执行函数
  const result = ctx[key](...args);
  delete ctx[key];
  return result;
};

function method(a, b) {
  console.log(this, a, b);
}

const key = "abc";
const obj = {
  [key]: 123
};

method.myCall(obj, 1, 2);
